package com.atomcorp.controlador;

import com.atomcorp.modelo.Cliente;
import com.atomcorp.servicio.ClienteServicio;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.ResourceBundle;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Pagination;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.Tooltip;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.FileChooser;
import javax.swing.JOptionPane;
import vista.SistemaFacturacion;

/**
 * FXML Controller class
 *
 * @author Harold Portocarrero
 */
public class AdministrarClientesController implements Initializable {
    
    @FXML Button btnBuscarCliente;
    @FXML Button btnNuevoCliente;
    @FXML Button btnEliminarCliente;
    @FXML Button btnCancelar;
    @FXML Button btnCargar;
    @FXML Button btnGuardarMasivo;
    @FXML CheckBox cbRuc;
    @FXML TextField txtIdentificacion;
    @FXML TextField txtApellidos;
    @FXML TextField txtNombres;
    @FXML TextField txtDireccion;
    @FXML TextField txtTelefono;
    @FXML TextField txtArchivo;
    @FXML CheckBox cbTerceraEdad;
    @FXML CheckBox cbDiscapacidad;
    @FXML TableView tbClientes;
    @FXML Pagination pagination;
    @FXML TableColumn colIdentificacion;
    @FXML TableColumn colApellidos;
    @FXML TableColumn colNombres;
    @FXML TableColumn colDireccion;
    @FXML TableColumn colTelefono;   
    private Cliente nuevoCliente;
    private ClienteServicio clienteServicio;
    private ObservableList<Cliente> listaClientes = FXCollections.observableArrayList();
    private ObservableList<Cliente> resulConsulta = FXCollections.observableArrayList();
    int pageCount = 5;
    int itemsPerPage = 5;
    int currentPageIndex = 0;
    private Long txtIdCliente;
    FileChooser fileChooser = new FileChooser();
    File file;
    List<String> listaArchivo;

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        btnBuscarCliente.setTooltip(new Tooltip("Buscar cliente"));
        btnNuevoCliente.setTooltip(new Tooltip("Guardar/Editar cliente"));
        btnEliminarCliente.setTooltip(new Tooltip("Eliminar cliente"));
        btnCancelar.setTooltip(new Tooltip("Cancelar/limpiar"));
        btnCargar.setTooltip(new Tooltip("Cargar archivo de clientes"));
        btnGuardarMasivo.setTooltip(new Tooltip("Guardar clientes masivamente"));
        btnEliminarCliente.setDisable(true);
        btnGuardarMasivo.setDisable(true);
        clienteServicio = new ClienteServicio();
        txtArchivo.setDisable(true);
        fileChooser.setTitle("Seleccione el archivo (*.csv)");
        iniciarColumnasTablaClientes();
        listarClientes();
        seleccionarCliente();
        paginarTabla();
    }
    
    public void cargarArchivo(){
        file = null;
        btnGuardarMasivo.setDisable(true);
        FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter("Archivos csv (*.csv)", "*.csv");
        fileChooser.getExtensionFilters().add(extFilter);
        file = fileChooser.showOpenDialog(null);
        if(file != null){
            txtArchivo.setText(file.getPath());
            listarLineasArchivo();
        }        
    }
    
    public void listarLineasArchivo(){
        FileReader fl = null;
        try {
            this.listaArchivo = new ArrayList<>();
            if(file != null){
                btnGuardarMasivo.setDisable(false);
                fl = new FileReader(file);
                BufferedReader br = new BufferedReader(fl);
                String linea = "";
                while ((linea = br.readLine()) != null) {
                    String s = linea.trim();
                    this.listaArchivo.add(s);
                }
                br.close();
            }
        } catch (FileNotFoundException ex) {
            Logger.getLogger(AdministrarClientesController.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(AdministrarClientesController.class.getName()).log(Level.SEVERE, null, ex);
        } finally {
            try {
                fl.close();                
            } catch (IOException ex) {
                Logger.getLogger(AdministrarClientesController.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    
    public void guardarMasivo(){
        int cont = 0;
        for(String s : listaArchivo){
            if(cont > 0){
                Cliente cliente = new Cliente(s.split(";")[0], s.split(";")[1], s.split(";")[2], Boolean.parseBoolean(s.split(";")[3]), 
                                          s.split(";")[4], s.split(";")[5], Boolean.parseBoolean(s.split(";")[6]), 
                                          Boolean.parseBoolean(s.split(";")[7]), true);
                clienteServicio.ingresarCliente(cliente);
            }            
            cont++;
        }
        listarClientes();
        limpiarCliente();
    }
    
    public void ingresarClientes(){
        resulConsulta = clienteServicio.obtenerClientePorCriterio("IDENTIFICACION",txtIdentificacion.getText());
        if(resulConsulta.size() == 0){
            nuevoCliente = new Cliente(txtIdentificacion.getText(),txtApellidos.getText(),txtNombres.getText(),cbRuc.isSelected(), 
                    txtDireccion.getText(), txtTelefono.getText(), cbDiscapacidad.isSelected(), cbTerceraEdad.isSelected(),Boolean.TRUE);
            clienteServicio.ingresarCliente(nuevoCliente);
        }else{
            nuevoCliente = new Cliente(txtIdentificacion.getText(),txtApellidos.getText(),txtNombres.getText(),cbRuc.isSelected(), 
                    txtDireccion.getText(), txtTelefono.getText(), cbDiscapacidad.isSelected(), cbTerceraEdad.isSelected(),Boolean.TRUE, txtIdCliente);
            clienteServicio.editarCliente(nuevoCliente);
        }
        listarClientes();
        limpiarCliente();
    }
    
    public void seleccionarCliente(){
        tbClientes.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Cliente>() {
            @Override
            public void changed(ObservableValue<? extends Cliente> ov, Cliente valorAnterior, Cliente valorNuevo) { 
                if(valorNuevo != null){
                    txtIdCliente = valorNuevo.getId();
                    mostrarDetalleCliente(valorNuevo);
                }                
            }
        });
    }
    
    public void buscarClientes(){
        if(!txtIdentificacion.getText().equals("")){
            listarClientesPorCriterio("IDENTIFICACION",txtIdentificacion.getText());
        }else if(!txtApellidos.getText().equals("")){
            listarClientesPorCriterio("APELLIDOS",txtApellidos.getText());
        }else if(!txtNombres.getText().equals("")){
            listarClientesPorCriterio("NOMBRES",txtNombres.getText());
        }else{
            listarClientes();
        }
    }
    
    public void listarClientesPorCriterio(String condicion, String valor) {
        mostrarDetalleCliente(null);
        tbClientes.getItems().removeAll(listaClientes);
        if(listaClientes != null){listaClientes.removeAll(listaClientes);}
        listaClientes = clienteServicio.obtenerClientePorCriterio(condicion, valor.toUpperCase());
        if (listaClientes != null) {            
            actualizarTablaCliente();
        }
    }
    
    public void eliminarCliente(){
        int confirmarEliminar = JOptionPane.showConfirmDialog(null, "Realmente desea eliminar este cliente?");
        if (confirmarEliminar == 0) {
            boolean ok = clienteServicio.eliminarCliente(txtIdCliente);
            if(ok){
               JOptionPane.showMessageDialog(null, "Registro eliminado correctamente"); 
               listarClientes();
            }
        }        
    }
    
    public void iniciarColumnasTablaClientes(){
        colIdentificacion.setCellValueFactory(new PropertyValueFactory<Cliente, String>("identificacion"));
        colApellidos.setCellValueFactory(new PropertyValueFactory<Cliente, String>("apellidos"));
        colNombres.setCellValueFactory(new PropertyValueFactory<Cliente, String>("nombres"));
        colDireccion.setCellValueFactory(new PropertyValueFactory<Cliente, String>("direccion"));
        colTelefono.setCellValueFactory(new PropertyValueFactory<Cliente, String>("telefono"));
    }
    
    public void listarClientes() {
        mostrarDetalleCliente(null);
        tbClientes.getItems().removeAll(listaClientes);
        if(listaClientes != null){listaClientes.removeAll(listaClientes);}
        listaClientes = clienteServicio.listarClientes();
        if (listaClientes != null) {          
            actualizarTablaCliente();
        }
    }
    
    public void actualizarTablaCliente(){
        pageCount = getPageCount(listaClientes.size(), itemsPerPage);
        pagination.setPageCount(pageCount);
        tbClientes.getItems().setAll(listaClientes.subList(currentPageIndex * itemsPerPage, ((currentPageIndex * itemsPerPage + itemsPerPage <= listaClientes.size()) ? currentPageIndex * itemsPerPage + itemsPerPage : listaClientes.size())));
    }
    
    private int getPageCount(int totalCount, int itemsPerPage) {
        float floatCount = Float.valueOf(totalCount) / Float.valueOf(itemsPerPage);
        int intCount = totalCount / itemsPerPage;
        return ((floatCount > intCount) ? ++intCount : intCount);
    }
    
    public void paginarTabla(){
        pageCount = getPageCount(listaClientes.size(), itemsPerPage);
        pagination.setPageCount(pageCount);
        pagination.currentPageIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
              currentPageIndex = newValue.intValue();
              actualizarTablaCliente();
            }
        });
    }
    
    private void mostrarDetalleCliente(Cliente cliente) {
        if (cliente != null) {
            btnEliminarCliente.setDisable(false);
            cbRuc.setSelected(cliente.getRucCedula());
            txtIdentificacion.setText(cliente.getIdentificacion());
            txtApellidos.setText(cliente.getApellidos());
            txtNombres.setText(cliente.getNombres());
            txtDireccion.setText(cliente.getDireccion());
            txtTelefono.setText(cliente.getTelefono());
            cbTerceraEdad.setSelected(cliente.getTerceraEdad());
            cbDiscapacidad.setSelected(cliente.getDiscapacidad());
        } else {
            limpiarCliente();
        }
    }
    
    public void limpiarCliente() {
        nuevoCliente = new Cliente();
        cbRuc.setSelected(Boolean.FALSE);
        txtIdentificacion.setText("");
        txtApellidos.setText("");
        txtNombres.setText("");
        txtDireccion.setText("");
        txtTelefono.setText("");
        cbTerceraEdad.setSelected(Boolean.FALSE);
        cbDiscapacidad.setSelected(Boolean.FALSE);
        btnEliminarCliente.setDisable(true);
        file = null;
        btnGuardarMasivo.setDisable(true);
        txtArchivo.setText("");
    }
    
    @FXML
    protected void itemAdministrar(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
    
    @FXML
    protected void itemCliente(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaClientes();
    }
    
    @FXML
    protected void itemProducto(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
    
    @FXML
    protected void itemFactura(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaFactura();
    }
    
    @FXML
    protected void itemReporte(ActionEvent event) {
        SistemaFacturacion.getInstance().pantallaAdministracion();
    }
}
